package com.zenithmind.chat.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.chat.pojo.entity.ChatGroupMemberSetting;
import com.zenithmind.chat.pojo.dto.ChatGroupMemberSettingDTO;
import com.zenithmind.chat.pojo.vo.ChatGroupMemberSettingVO;

import java.util.List;

/**
 * 群组成员设置服务接口 - 遵循单一职责原则
 * 只负责群组成员设置的业务逻辑处理
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface ChatGroupMemberSettingService extends IService<ChatGroupMemberSetting> {

    /**
     * 获取成员设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 成员设置
     */
    ChatGroupMemberSettingVO getMemberSetting(String groupId, String userId);

    /**
     * 更新成员设置
     * 
     * @param dto 设置信息
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateMemberSetting(ChatGroupMemberSettingDTO dto, String operatorId);

    /**
     * 创建默认成员设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 设置ID
     */
    String createDefaultSetting(String groupId, String userId, String operatorId);

    /**
     * 删除成员设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 删除结果
     */
    Boolean deleteMemberSetting(String groupId, String userId, String operatorId);

    /**
     * 获取群组的所有成员设置
     * 
     * @param groupId 群组ID
     * @return 成员设置列表
     */
    List<ChatGroupMemberSettingVO> getGroupMemberSettings(String groupId);

    /**
     * 获取用户的所有群组设置
     * 
     * @param userId 用户ID
     * @return 群组设置列表
     */
    List<ChatGroupMemberSettingVO> getUserGroupSettings(String userId);

    /**
     * 更新成员昵称
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param nickname 昵称
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateMemberNickname(String groupId, String userId, String nickname, String operatorId);

    /**
     * 更新置顶状态
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param isTop 是否置顶
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateTopStatus(String groupId, String userId, Boolean isTop, String operatorId);

    /**
     * 更新免打扰状态
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param isMuted 是否免打扰
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateMuteStatus(String groupId, String userId, Boolean isMuted, String operatorId);

    /**
     * 更新消息提醒设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param messageNotification 消息提醒设置
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateMessageNotification(String groupId, String userId, Integer messageNotification, String operatorId);

    /**
     * 更新显示成员昵称设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param showMemberNickname 是否显示成员昵称
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateShowMemberNickname(String groupId, String userId, Boolean showMemberNickname, String operatorId);

    /**
     * 更新保存到通讯录设置
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param saveToContacts 是否保存到通讯录
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean updateSaveToContacts(String groupId, String userId, Boolean saveToContacts, String operatorId);

    /**
     * 获取置顶群组列表
     * 
     * @param userId 用户ID
     * @return 置顶群组设置列表
     */
    List<ChatGroupMemberSettingVO> getTopGroups(String userId);

    /**
     * 获取免打扰群组列表
     * 
     * @param userId 用户ID
     * @return 免打扰群组设置列表
     */
    List<ChatGroupMemberSettingVO> getMutedGroups(String userId);

    /**
     * 获取群组中的置顶成员列表
     * 
     * @param groupId 群组ID
     * @return 置顶成员设置列表
     */
    List<ChatGroupMemberSettingVO> getTopMembers(String groupId);

    /**
     * 获取群组中的免打扰成员列表
     * 
     * @param groupId 群组ID
     * @return 免打扰成员设置列表
     */
    List<ChatGroupMemberSettingVO> getMutedMembers(String groupId);

    /**
     * 检查设置是否存在
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @return 是否存在
     */
    Boolean checkSettingExists(String groupId, String userId);

    /**
     * 统计置顶群组数量
     * 
     * @param userId 用户ID
     * @return 置顶群组数量
     */
    Integer countTopGroups(String userId);

    /**
     * 统计免打扰群组数量
     * 
     * @param userId 用户ID
     * @return 免打扰群组数量
     */
    Integer countMutedGroups(String userId);

    /**
     * 统计群组中置顶成员数量
     * 
     * @param groupId 群组ID
     * @return 置顶成员数量
     */
    Integer countTopMembers(String groupId);

    /**
     * 统计群组中免打扰成员数量
     * 
     * @param groupId 群组ID
     * @return 免打扰成员数量
     */
    Integer countMutedMembers(String groupId);

    /**
     * 批量删除群组的所有成员设置
     * 
     * @param groupId 群组ID
     * @param operatorId 操作人ID
     * @return 删除数量
     */
    Integer batchDeleteByGroupId(String groupId, String operatorId);

    /**
     * 批量删除用户的所有群组设置
     * 
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 删除数量
     */
    Integer batchDeleteByUserId(String userId, String operatorId);

    /**
     * 批量更新成员设置
     * 
     * @param groupId 群组ID
     * @param userIds 用户ID列表
     * @param dto 设置信息
     * @param operatorId 操作人ID
     * @return 更新结果
     */
    Boolean batchUpdateMemberSettings(String groupId, List<String> userIds, ChatGroupMemberSettingDTO dto, String operatorId);

    /**
     * 复制成员设置
     * 
     * @param sourceGroupId 源群组ID
     * @param sourceUserId 源用户ID
     * @param targetGroupId 目标群组ID
     * @param targetUserId 目标用户ID
     * @param operatorId 操作人ID
     * @return 复制结果
     */
    Boolean copyMemberSetting(String sourceGroupId, String sourceUserId, String targetGroupId, String targetUserId, String operatorId);

    /**
     * 重置成员设置为默认值
     * 
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 重置结果
     */
    Boolean resetToDefault(String groupId, String userId, String operatorId);

    /**
     * 导出成员设置
     * 
     * @param groupId 群组ID
     * @param operatorId 操作人ID
     * @return 导出文件路径
     */
    String exportMemberSettings(String groupId, String operatorId);

    /**
     * 导入成员设置
     *
     * @param groupId 群组ID
     * @param filePath 文件路径
     * @param operatorId 操作人ID
     * @return 导入结果
     */
    Boolean importMemberSettings(String groupId, String filePath, String operatorId);

    /**
     * 获取成员设置统计信息
     *
     * @param groupId 群组ID
     * @return 统计信息
     */
    Object getMemberSettingStatistics(String groupId);

    /**
     * 同步成员设置
     *
     * @param groupId 群组ID
     * @param userId 用户ID
     * @param operatorId 操作人ID
     * @return 同步结果
     */
    Boolean syncMemberSetting(String groupId, String userId, String operatorId);
}
